/**
 * 角色模块服务文件
 */

const db = require('../db/roles');
const { existsByRoleId } = require('../db/users');
const menuDB = require('../db/menus');
const { menuType } = require('../utils/Consts');

/**
 * 添加
 * @param {*} ctx 
 */
const add = async ctx => {
    try {
        const { body } = ctx.request;
        const { name } = body;
        const result = await db.exists(name);
        if (result) {
            return ctx.body = {
                code: 0,
                msg: '已存在相同的角色'
            }
        }
        await db.add(body);
        ctx.body = {
            code: 1,
            msg: '角色添加成功'
        }
    } catch (error) {
        ctx.app.emit('error', error);
        ctx.body = {
            code: 0,
            msg: '角色添加失败'
        }
    }
}

/**
 * 修改
 * @param {*} ctx 
 */
const update = async ctx => {
    try {
        const { body } = ctx.request;
        const { id, name } = body;
        let result = await db.exists(name, id);
        if (result) {
            return ctx.body = {
                code: 0,
                msg: '已存在相同的角色名称'
            }
        }
        await db.update(body);
        ctx.body = {
            code: 1,
            msg: '角色修改成功'
        }
    } catch (error) {
        ctx.app.emit('error', error);
        ctx.body = {
            code: 0,
            msg: '角色修改失败'
        }
    }
}

/**
 * 获取所有
 * @param {*} ctx 
 */
const getAll = async ctx => {
    try {
        const data = await db.getAll();
        ctx.body = {
            code: 1,
            data
        }
    } catch (error) {
        ctx.app.emit('error', error);
        ctx.body = {
            code: 0,
            msg: '角色获取失败'
        }
    }
}

/**
 * 删除角色
 * @param {*} ctx 
 */
const deleteRole = async ctx => {
    try {
        const { id } = ctx.request.params;
        const result = await existsByRoleId(id);
        if (result) {
            return ctx.body = {
                code: 0,
                msg: '此角色下还存在用户，请先将此角色下的用户变更角色后再删除'
            }
        }
        await db.deleteRole(id);
        ctx.body = {
            code: 1,
            msg: '角色删除成功'
        }
    } catch (error) {
        ctx.app.emit('error', error);
        ctx.body = {
            code: 0,
            msg: '角色删除失败'
        }
    }
}

/**
 * 设置权限
 * @param {*} ctx 
 */
const setRights = async ctx => {
    try {
        const { body } = ctx.request;
        const { role_id, menu_ids } = body;
        const menus = await menuDB.getAll();
        const ids = menu_ids.filter(c => menus.some(d => d.type == menuType.权限 && d.id == c));
        await db.setRights(role_id, ids);
        ctx.body = {
            code: 1,
            msg: '权限设置成功'
        }
    } catch (error) {
        ctx.app.emit('error', error);
        ctx.body = {
            code: 0,
            msg: '权限设置失败'
        }
    }
}

module.exports = {
    add,
    update,
    getAll,
    setRights,
    deleteRole
}